<?php 
class Controller_Payment_Alipay extends Controller_App_Template
{
    public function __construct ($req, $res)
    {
        $this->template = 'smarty:payment/blank';
        parent::__construct($req, $res);
    }

    public function action_order ($orderNo)
    {
        $orderDetail = App_Order::detail ($orderNo);
        $orderTitle  = Arr::get($orderDetail, 'title');
        $orderMoney  = Arr::get($orderDetail, 'moneyTotal', 0);


        require_once(DOCROOT . "resource/alipay/alipay.config.php");
        require_once(DOCROOT . "resource/alipay/lib/alipay_submit.class.php");

        //支付类型
        $payment_type = "1";
        //服务器异步通知页面路径
        $notify_url = "http://www.youzigouwu.com/payment/alipay/notify";
        //需http://格式的完整路径，不能加?id=123这类自定义参数
        //页面跳转同步通知页面路径
        $return_url = "http://www.youzigouwu.com/order/payresult/$orderNo";
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
        //商户订单号
        $out_trade_no = $orderNo;
        //商户网站订单系统中唯一订单号，必填
        //订单名称
        $subject = $orderTitle;
        //必填
        //付款金额
        $total_fee = $orderMoney / 100;
        //必填
        //商品展示地址
        $show_url = $return_url;
        //必填，需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html
        //订单描述
        $body = $orderTitle;
        //选填
        //超时时间
        $it_b_pay = "";
        //选填
        //钱包token
        $extern_token = "";
        //选填


        //构造要请求的参数数组，无需改动
        $parameter = array(
			"service" => "alipay.wap.create.direct.pay.by.user",
			"partner" => trim($alipay_config['partner']),
			"seller_id" => trim($alipay_config['seller_id']),
			"payment_type"	=> $payment_type,
			"notify_url"	=> $notify_url,
			"return_url"	=> $return_url,
			"out_trade_no"	=> $out_trade_no,
			"subject"	=> $subject,
			"total_fee"	=> $total_fee,
			"show_url"	=> $show_url,
			"body"	=> $body,
			"it_b_pay"	=> $it_b_pay,
			"extern_token"	=> $extern_token,
			"_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );

        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");

        $this->template->set_filename('smarty:payment/alipay');
        $this->template->set('alipay_form', $html_text);
    }

    public function action_notify ()
    {
        Kohana::$log->add(Log::DEBUG, "ALIPAY NOTIRY: " . print_r($_POST, TRUE));

        require_once(DOCROOT . "resource/alipay/alipay.config.php");
        require_once(DOCROOT . "resource/alipay/lib/alipay_notify.class.php");

        // 支付宝支付
        $paymentId = 2; 

        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        //验证成功
        if($verify_result) {

        	//请在这里加上商户的业务逻辑程序代
        	
        	//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
        	
            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
        	
        	//商户订单号
        	$out_trade_no = $_POST['out_trade_no'];
        
        	//支付宝交易号
        	$trade_no = $_POST['trade_no'];
        
        	//交易状态
        	$trade_status = $_POST['trade_status'];

        	//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
        			
                    //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
        			//如果有做过处理，不执行商户的业务程序
                    App_Order::setOrderPaid($out_trade_no, $trade_no, $paymentId);
        				
        		    //注意：
        		    //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
        
                    //调试用，写文本函数记录程序运行情况是否正常
                    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");

            } 
        	//付款完成后，支付宝系统发送该交易状态通知
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {

        			//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
        			//如果有做过处理，不执行商户的业务程序

                    App_Order::setOrderPaid($out_trade_no, $trade_no, $paymentId);
        				
        		    //注意：
        		    //付款完成后，支付宝系统发送该交易状态通知
        
                    //调试用，写文本函数记录程序运行情况是否正常
                    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }
        	//退款成功，支付宝系统发送该交易状态通知
            else if ($_POST['trade_status'] == 'TRADE_CLOSED') {

                    App_Order::setOrderRefunded($out_trade_no);
        				
        		    //注意：
        		    //付款完成后，支付宝系统发送该交易状态通知
        
                    //调试用，写文本函数记录程序运行情况是否正常
                    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }
        
 
        
            //请不要修改或删除
        	echo "success";exit;		
        	
        }
        else {

            //验证失败
            echo "fail";exit;
        
        } // if
    }

    public function action_notify_refund ()
	{
        require_once(DOCROOT."/resource/alipay_refund/alipay.config.php");
        require_once(DOCROOT."/resource/alipay_refund/lib/alipay_notify.class.php");

        Kohana::$log->add(Log::DEBUG, "ALIPAY_REFUND_NOTIFY:".print_r($_POST, TRUE));
		
		// 计算得出通知验证结果
		$alipayNotify = new AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyNotify();
		
        // 验证成功
		if($verify_result) 
        {
			//请在这里加上商户的业务逻辑程序代
		
			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			
		    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			
			//批次号
			$batch_no = $_POST['batch_no'];
		
			//批量退款数据中转账成功的笔数
			$success_num = $_POST['success_num'];
		
			//批量退款数据中的详细信息
			$result_details = $_POST['result_details'];
		
		
			// 判断是否在商户网站中已经做过了这次通知返回的处理
			// 如果没有做过处理，那么执行商户的业务程序
			// 如果有做过处理，那么不执行商户的业务程序

            $arr_details = explode('#', $result_details);
            $ret = array();
            foreach ($arr_details as $rs)
            {
                $items = explode('^', $rs);
                $ret[] = array(
                    'transactionId' => $items[0],
                    'moneyYuan'     => $items[1],
                    'codeMsg'       => $items[2],
                );
            }
	    Kohana::$log->add(Log::DEBUG, "ALIPAY REFUND DETAILS:" . print_r($ret, TRUE));

            try {
                $alipay = new Payment_Alipay_Refund();
                $alipay->setResult($ret);
            }
            catch (Exception $e)
            {
                //
            }
		        
			echo "success";exit;		//请不要修改或删除
		
			// 调试用，写文本函数记录程序运行情况是否正常
			// logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
		
			// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
		}
		else 
        {
		    //验证失败
		    echo "fail";exit;
		
		    //调试用，写文本函数记录程序运行情况是否正常
		    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
		}
		
	} // function 
}
